home *** CD-ROM | disk | FTP | other *** search
- /* cu-notic.txt NCSA Telnet version 2.2C 2/3/89
- Notice:
- Portions of this file have been modified by
- The Educational Resources Center of Clarkson University.
-
- All modifications made by Clarkson University are hereby placed
- in the public domain, provided the following statement remain in
- all source files.
-
- "Portions Developed by the Educational Resources Center,
- Clarkson University"
-
- Bugs and comments to bkc@omnigate.clarkson.edu
- bkc@clgw.bitnet
-
- Brad Clements
- Educational Resources Center
- Clarkson University
- */
-
- /*
- *
- * Virtual Screen Kernel Emulation Routines
- * (vsem.c)
- *
- * National Center for Supercomputing Applications
- * by Gaige B. Paulsen
- *
- * This file contains the private emulation calls for the NCSA
- * Virtual Screen Kernel.
- *
- * Version Date Notes
- * ------- ------ ---------------------------------------------------
- * 0.01 861102 Initial coding -GBP
- * 0.10 861111 Added/Modified VT emulator -GBP
- * 0.50 861113 First compiled edition -GBP
- * 2.1 871130 NCSA Telnet 2.1 -GBP
- * 2.2 880715 NCSA Telnet 2.2 -GBP
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "sprite.h"
- #include "os.h"
- #include "bbc.h"
- #include "menu.h"
- #include "wimp.h"
- #include "wimpt.h"
- #include "os.h"
- #include "global.h"
- #include "misc.h"
- #include "window.h"
- #include "session.h"
-
- #define OS_ChangedBox 0x0000005a
-
- typedef struct
- {
- int flag;
- wimp_box box;
- }
- change_box;
-
- static void Control_Chars(struct Window_Struct *, char);
- static void Window_Scroll(struct Window_Struct *);
- static os_error *Changed_Box(int, change_box **);
- static int keyscan(int);
-
- #define XtoWork(x) ((x) << 1)
- #define YtoWork(y) ((y) << 2)
-
- void Window_Write(void *w, char *s, int n)
- {
- struct Window_Struct *Window = (struct Window_Struct *)w;
- sprite_state State;
- wimp_redrawstr r;
- register int Escflg;
- change_box *Box;
- int i, cx, cy;
-
- if (Window->Record != NULL) fwrite(s, 1, n, Window->Record);
-
- sprite_outputtosprite(Window->Sprite.Area, &Window->Sprite.id, Window->Save_Area, &State);
-
- Changed_Box(1, &Box);
- Changed_Box(2, &Box);
-
- Escflg = Window->Esc_Flag;
-
- if (Window->Cursor)
- {
- cx = Window->x * 16;
- cy = 768 - Window->y * 32 - 28;
- bbc_vduq(25, 4, cx % 256, cx / 256,
- cy % 256, cy / 256);
- bbc_vduq(25, 102, (cx + 16) % 256, (cx + 16) / 256,
- (cy + 24) % 256, (cy + 24) / 256);
- }
-
- bbc_vduq(17, 128 + Window->Background[ATTR_NORMAL]);
- bbc_vduq(17, Window->Foreground[ATTR_NORMAL]);
-
- while (n > 0)
- {
- while (Escflg == ESCAPE_NONE && n > 0 && *s < 32)
- {
- switch (*s)
- {
- case 0x1b: /* \E ... */
- Escflg = ESCAPE_FOUND;
- break;
- default:
- Control_Chars(Window, *s);
- break;
- }
-
- s++;
- n--;
- }
-
- bbc_vduq(17, 128 + Window->Background[Window->Attr]);
- bbc_vduq(17, Window->Foreground[Window->Attr]);
-
- while (n > 0 && Escflg == ESCAPE_NONE && *s >= 32)
- {
- if ((Window->Charset == CHARSET_G0 && Window->G0 == FONT_GRAPH) ||
- (Window->Charset == CHARSET_G1 && Window->G1 == FONT_GRAPH))
- {
- bbc_vdu((*s >= 0x60) ? *s + 128 : *s);
- }
- else
- {
- bbc_vdu(*s);
- }
-
- Window->x++;
- Window_Scroll(Window);
-
- s++;
- n--;
- }
-
- bbc_vduq(17, 128 + Window->Background[ATTR_NORMAL]);
- bbc_vduq(17, Window->Foreground[ATTR_NORMAL]);
-
- while (n > 0 && Escflg == ESCAPE_FOUND)
- {
- switch (*s)
- {
- case '[': /* \E[ ... */
- Window->Parmptr = 0;
- for (i = 0; i < 6; i++)
- Window->Parms[i] = -1;
- Escflg = ESCAPE_1;
- break;
- case '7': /* \E7 - sc */
- Window->Save_x = Window->x;
- Window->Save_y = Window->y;
- Window->Save_Attr = Window->Attr;
- Escflg = ESCAPE_NONE;
- break;
- case '8': /* \E8 - rc */
- Window->x = Window->Save_x;
- Window->y = Window->Save_y;
- Window->Attr = Window->Save_Attr;
- Escflg = ESCAPE_NONE;
- break;
- case 'c': /* \Ec ... */
- Window_Reset(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'D': /* \ED */
- Window->y++;
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'E': /* \EE */
- Window->y++;
- Window->x = 0;
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'M': /* \EM - ri */
- Window->y--;
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case '>': /* \E> - rmkx */
- Window->Session->keypad = 0;
- Escflg = ESCAPE_NONE;
- break;
- case '=': /* \E= - smkx */
- Window->Session->keypad = 1;
- Escflg = ESCAPE_NONE;
- break;
- case '(': /* \E( ... */
- Escflg = ESCAPE_3;
- break;
- case ')': /* \E) ... */
- Escflg = ESCAPE_4;
- break;
- case '#': /* \E# ... */
- Escflg = ESCAPE_5;
- break;
- case 'H': /* \EH - hts */
- Window->Tabs[Window->x] = 'x';
- Escflg = ESCAPE_NONE;
- break;
- default:
- if (*s < 32)
- Control_Chars(Window, *s);
- else
- Escflg = ESCAPE_NONE;
- break;
- }
-
- s++;
- n--;
- }
-
- while (Escflg == ESCAPE_1 && n > 0)
- {
- switch (*s)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (Window->Parms[Window->Parmptr] < 0) Window->Parms[Window->Parmptr] = 0;
- Window->Parms[Window->Parmptr] *= 10;
- Window->Parms[Window->Parmptr] += *s - '0';
- break;
- case '?': /* \E[? ... */
- Window->Parms[Window->Parmptr++] = -2;
- break;
- case ';': /* \E[nn; ... */
- Window->Parmptr++;
- break;
- case 'A': /* \E[%p1%dA - cuu, cuu1 */
- if (Window->Parms[0] < 1)
- Window->y--;
- else
- Window->y -= Window->Parms[0];
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'B': /* \E[%p1%dB - cud */
- if (Window->Parms[0] < 1)
- Window->y++;
- else
- Window->y += Window->Parms[0];
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'C': /* \E[%p1%dC - cuf, cuf1 */
- if (Window->Parms[0] < 1)
- Window->x++;
- else
- Window->x += Window->Parms[0];
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'D': /* \E[%p1%dD - cub, cub1 */
- if (Window->Parms[0] < 1)
- Window->x--;
- else
- Window->x -= Window->Parms[0];
- Window_Scroll(Window);
- Escflg = ESCAPE_NONE;
- break;
- case 'f': /* \E[%i%p1%d;%p2%df */
- case 'H': /* \E[%i%p1%d;%p2%dH - cup */
- Window->x = Window->Parms[1] - 1;
- Window->y = Window->Parms[0] - 1;
- if (Window->x < 0) Window->x = 0;
- if (Window->x > 79) Window->x = 79;
- if (Window->y < Window->Top) Window->y = Window->Top;
- if (Window->y > Window->Bottom) Window->y = Window->Bottom;
- bbc_vduq(31, Window->x, Window->y);
- Escflg = ESCAPE_NONE;
- break;
- case 'K': /* \E[K - e1*/
- switch (Window->Parms[0])
- {
- case -1:
- case 0:
- bbc_vduq(23,8,5,6,0,0,0,0,0,0);
- break;
- case 1:
- bbc_vduq(23,8,4,5,0,0,0,0,0,0);
- break;
- case 2:
- bbc_vduq(23,8,4,6,0,0,0,0,0,0);
- break;
- default:
- Escflg = ESCAPE_NONE;
- break;
- }
- Escflg = ESCAPE_NONE;
- break;
- case 'J': /* \E[J - ed */
- switch (Window->Parms[0])
- {
- case -1:
- case 0:
- bbc_vduq(23,8,5,10,0,0,0,0,0,0);
- break;
- case 1:
- bbc_vduq(23,8,0,5,0,0,0,0,0,0);
- break;
- case 2:
- bbc_vduq(23,8,0,10,0,0,0,0,0,0);
- break;
- default:
- Escflg = ESCAPE_NONE;
- break;
- }
- Escflg = ESCAPE_NONE;
- break;
- case 'm': /* \E[nnm - smso, rmso, smul, */
- /* rmul, bold, rev, blink */
- switch (Window->Parms[0])
- {
- case -1:
- case 0: /* \E[0m - rmso, rmul */
- Window->Attr = ATTR_NORMAL;
- break;
- case 1: /* \E[1m - bold */
- Window->Attr = ATTR_BOLD;
- break;
- case 4: /* \E[4m - smul */
- Window->Attr = ATTR_UNDER;
- break;
- case 5: /* \E[5m - blink */
- Window->Attr = ATTR_BLINK;
- break;
- case 7: /* \E[7m - smso, rev */
- Window->Attr = ATTR_REVERSE;
- break;
- default:
- break;
- }
- Escflg = ESCAPE_NONE;
- break;
- case 'L': /* \E[L - il1 */
- if (Window->Parms[0] < 1) Window->Parms[0] = 1;
- bbc_vduq(28, 0, Window->Bottom, 79, Window->y);
- for (i = 0; i < Window->Parms[0]; i++)
- bbc_vduq(23,7,0,2,0,0,0,0,0,0);
- bbc_vduq(28,0,Window->Bottom,79,Window->Top);
- bbc_vduq(31, Window->x, Window->y);
- Escflg = ESCAPE_NONE;
- break;
- case 'M': /* \E[M - dl1 */
- if (Window->Parms[0] < 1) Window->Parms[0] = 1;
- bbc_vduq(28, 0, Window->Bottom, 79, Window->y);
- for (i = 0; i < Window->Parms[0]; i++)
- bbc_vduq(23,7,0,3,0,0,0,0,0,0);
- bbc_vduq(28, 0, Window->Bottom, 79, Window->Top);
- bbc_vduq(31, Window->x, Window->y);
- Escflg = ESCAPE_NONE;
- break;
- case 'P': /* \E[P */
- if (Window->Parms[0] < 1) Window->Parms[0] = 1;
- bbc_vduq(28, Window->x, Window->y, 79, Window->y);
- for (i = 0; i < Window->Parms[0]; i++)
- bbc_vduq(23,7,0,1,0,0,0,0,0,0);
- bbc_vduq(28, 0, Window->Bottom, 79, Window->Top);
- bbc_vduq(31, Window->x, Window->y);
- Escflg = ESCAPE_NONE;
- break;
- case 'r': /* \E[r */
- if (Window->Parms[0] < 0)
- Window->Top = 0;
- else
- Window->Top = Window->Parms[0] - 1;
- if (Window->Parms[1] < 0)
- Window->Bottom = 23;
- else
- Window->Bottom = Window->Parms[1] - 1;
- if (Window->Top < 0) Window->Top = 0;
- if (Window->Top > 22) Window->Top = 22;
- if (Window->Bottom < 1) Window->Bottom = 23;
- if (Window->Bottom > 23) Window->Bottom = 23;
- Window->x = 0;
- Window->y = Window->Top;
- bbc_vduq(28, 0, Window->Bottom , 79, Window->Top);
- bbc_vduq(31, Window->x, Window->y);
- Escflg = ESCAPE_NONE;
- break;
- case 'h': /* \E[h - cnorm, cvvis */
- Window->Cursor = 1;
- Escflg = ESCAPE_NONE;
- break;
- case 'l': /* \E[l - civis */
- Window->Cursor = 0;
- Escflg = ESCAPE_NONE;
- break;
- case 'g': /* \E[g - tbc */
- if (Window->Parms[0] == 3)
- {
- for (i = 0; i < SCREEN_WIDTH; i++)
- Window->Tabs[i] = ' ';
- }
- else
- {
- if (Window->Parms[0] == 0 || Window->Parms[0] < 0)
- Window->Tabs[Window->x] = ' ';
- }
- Escflg = ESCAPE_NONE;
- break;
- default:
- if (*s < 32)
- Control_Chars(Window, *s);
- else
- Escflg = ESCAPE_NONE;
- break;
- }
-
- s++;
- n--;
- }
-
- while (Escflg == ESCAPE_3 && n > 0)
- {
- switch (*s)
- {
- case 'A': /* \E(A */
- case 'B': /* \E(B - font0 */
- case '1': /* \E(1 */
- Window->G0 = FONT_ASCII;
- Escflg = ESCAPE_NONE;
- break;
- case '0': /* \E(0 - font1 */
- case '2': /* \E(2 */
- Window->G0 = FONT_GRAPH;
- Escflg = ESCAPE_NONE;
- break;
- default:
- if (*s < 32)
- Control_Chars(Window, *s);
- else
- Escflg = ESCAPE_NONE;
- break;
- }
-
- s++;
- n--;
- }
-
- while (Escflg == ESCAPE_4 && n > 0)
- {
- switch (*s)
- {
- case 'A': /* \E)A */
- case 'B': /* \E)B */
- case '1': /* \E)1 */
- Window->G1 = FONT_ASCII;
- Escflg = ESCAPE_NONE;
- break;
- case '0': /* \E)0 */
- case '2': /* \E)2 */
- Window->G1 = FONT_GRAPH;
- Escflg = ESCAPE_NONE;
- break;
- default:
- if (*s < 32)
- Control_Chars(Window, *s);
- else
- Escflg = ESCAPE_NONE;
- break;
- }
-
- s++;
- n--;
- }
-
- while (Escflg == ESCAPE_5 && n > 0)
- {
- if (*s < 32)
- Control_Chars(Window, *s);
- else
- Escflg = ESCAPE_NONE;
-
- s++;
- n--;
- }
- /*
- if (Escflg > ESCAPE_1 && n > 0)
- {
- Escflg = ESCAPE_NONE;
- s++;
- n--;
- }
- */
- }
-
- Window->Esc_Flag = Escflg;
-
- if (Window->Cursor)
- {
- cx = Window->x * 16;
- cy = 768 - Window->y * 32 - 28;
- bbc_vduq(25, 4, cx % 256, cx / 256,
- cy % 256, cy / 256);
- bbc_vduq(25, 102, (cx + 16) % 256, (cx + 16) / 256,
- (cy + 24) % 256, (cy + 24) / 256);
- }
-
- Changed_Box(-1, &Box);
-
- r.w = Window->Window_Handle;
- r.box.x0 = XtoWork(Box->box.x0) * Window->X_Mag_Mult / Window->X_Div_Mult - XtoWork(1);
- r.box.x1 = XtoWork(Box->box.x1) * Window->X_Mag_Mult / Window->X_Div_Mult + XtoWork(1);
- r.box.y0 = YtoWork(Box->box.y0 - SPRITE_HEIGHT) * Window->Y_Mag_Mult / Window->Y_Div_Mult - YtoWork(1);
- r.box.y1 = YtoWork(Box->box.y1 - SPRITE_HEIGHT) * Window->Y_Mag_Mult / Window->Y_Div_Mult + YtoWork(1);
-
- sprite_restorestate(State);
-
- Update_Window(Window, r);
- }
-
- static void Control_Chars(struct Window_Struct *Window, char c)
- {
- int i;
-
- switch (c)
- {
- case 0x07: /* ^G - bel */
- bbc_vdu(7);
- break;
- case 0x08: /* ^H - cub1 */
- Window->x--;
- Window_Scroll(Window);
- break;
- case 0x0e:
- Window->Charset = CHARSET_G1;
- break;
- case 0x0f:
- Window->Charset = CHARSET_G0;
- break;
- case 0x09: /* ^I - ht */
- for (i = Window->x + 1; i < SCREEN_WIDTH; i++)
- {
- if (Window->Tabs[i] == 'x')
- {
- Window->x = i;
- break;
- }
- }
- Window_Scroll(Window);
- break;
- case 0x0d: /* ^M - cr */
- Window->x = 0;
- bbc_vdu(13);
- break;
- case 0x0a: /* ^J - lf */
- Window->y++;
- Window->x = 0;
- if (Window->y > Window->Bottom)
- Window->y = Window->Bottom;
- bbc_vdu(10);
- bbc_vdu(13);
- break;
- default:
- break;
- }
- }
-
- /* TTY input driver */
- int keymap(int raw, int keypad, char *buffer, int c)
- {
- if (raw)
- {
- if (keypad)
- {
- if (keyscan(106))
- {
- strcpy(buffer, "\033Op");
- return(3);
- }
- if (keyscan(107))
- {
- strcpy(buffer, "\033Oq");
- return(3);
- }
- if (keyscan(124))
- {
- strcpy(buffer, "\033Or");
- return(3);
- }
- if (keyscan(108))
- {
- strcpy(buffer, "\033Os");
- return(3);
- }
- if (keyscan(122))
- {
- strcpy(buffer, "\033Ot");
- return(3);
- }
- if (keyscan(123))
- {
- strcpy(buffer, "\033Ou");
- return(3);
- }
- if (keyscan(26))
- {
- strcpy(buffer, "\033Ov");
- return(3);
- }
- if (keyscan(27))
- {
- strcpy(buffer, "\033Ow");
- return(3);
- }
- if (keyscan(42))
- {
- strcpy(buffer, "\033Ox");
- return(3);
- }
- if (keyscan(43))
- {
- strcpy(buffer, "\033Oy");
- return(3);
- }
- if (keyscan(59))
- {
- strcpy(buffer, "\033Om");
- return(3);
- }
- if (keyscan(58))
- {
- strcpy(buffer, "\033Ol");
- return(3);
- }
- if (keyscan(76))
- {
- strcpy(buffer, "\033On");
- return(3);
- }
- if (keyscan(60))
- {
- strcpy(buffer, "\033OM");
- return(3);
- }
- }
-
- switch (c)
- {
- case 0x181: /* F1 */
- strcpy(buffer, "\033OP");
- return(3);
- case 0x182: /* F2 */
- strcpy(buffer, "\033OQ");
- return(3);
- case 0x183: /* F3 */
- strcpy(buffer, "\033OR");
- return(3);
- case 0x184: /* F4 */
- strcpy(buffer, "\033OS");
- return(3);
- case 0x1CD: /* Insert */
- strcpy(buffer, "\033[1~");
- return(4);
- case 0x1E: /* Home */
- strcpy(buffer, "\033[2~");
- return(4);
- case 0x19F: /* Page Up */
- strcpy(buffer, "\033[3~");
- return(4);
- case 0x7F: /* Delete */
- strcpy(buffer, "\033[4~");
- return(4);
- case 0x18B: /* Copy */
- strcpy(buffer, "\033[5~");
- return(4);
- case 0x19E: /* Page Down */
- strcpy(buffer, "\033[6~");
- return(4);
- case 0x18F: /* Up Arrow */
- strcpy(buffer, "\033[A");
- return(3);
- case 0x18E: /* Down Arrow */
- strcpy(buffer, "\033[B");
- return(3);
- case 0x18D: /* Right Arrow */
- strcpy(buffer, "\033[C");
- return(3);
- case 0x18C: /* Left Arrow */
- strcpy(buffer, "\033[D");
- return(3);
- case 0x18A: /* Tab */
- strcpy(buffer, "\0x09");
- return(1);
- default:
- if (c < 0x7F)
- {
- *buffer = c;
- return(1);
- }
- break;
- }
- }
- else
- {
- switch (c)
- {
- case '\r':
- case '\n':
- strcpy(buffer, "\r\n");
- return(2);
- default:
- if (c < 0x7F)
- {
- *buffer = c;
- return(1);
- }
- break;
- }
- }
-
- return(0);
- }
-
- void Window_Reset(void *w)
- {
- struct Window_Struct *Window = (struct Window_Struct *)w;
- int i;
-
- Window->x = 0;
- Window->y = 0;
- Window->Top = 0;
- Window->Bottom = 23;
- Window->Attr = ATTR_NORMAL;
- Window->Cursor = 1;
- Window->G0 = FONT_ASCII;
- Window->G1 = FONT_GRAPH;
- Window->Charset = CHARSET_G0;
-
- Window->Parmptr = 0;
- for (i = 0; i < 6; i++) Window->Parms[i] = -1;
-
- for (i = 0; i < SCREEN_WIDTH; i++)
- Window->Tabs[i] = (i % TAB_STOPS) ? ' ' : 'x';
- Window->Tabs[SCREEN_WIDTH - 1] = 'x';
-
- bbc_vduq(28, 0, 23, 79, 0);
-
- bbc_vduq(23,96+128, 0x08,0x18,0x3C,0x7E,0x3C,0x18,0x08,0x00);
- bbc_vduq(23,97+128, 0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA);
-
- bbc_vduq(23,98+128, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,99+128, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,100+128,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,101+128,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
-
- bbc_vduq(23,102+128,0x3C,0x66,0x3C,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,103+128,0x18,0x18,0x7E,0x18,0x18,0x00,0x7E,0x00);
-
- bbc_vduq(23,104+128,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,105+128,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
-
- bbc_vduq(23,106+128,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00);
- bbc_vduq(23,107+128,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08);
- bbc_vduq(23,108+128,0x00,0x00,0x00,0x0F,0x08,0x08,0x08,0x08);
- bbc_vduq(23,109+128,0x08,0x08,0x08,0x0F,0x00,0x00,0x00,0x00);
- bbc_vduq(23,110+128,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08);
- bbc_vduq(23,111+128,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,112+128,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00);
- bbc_vduq(23,113+128,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00);
- bbc_vduq(23,114+128,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00);
- bbc_vduq(23,115+128,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF);
- bbc_vduq(23,116+128,0x08,0x08,0x08,0x0F,0x08,0x08,0x08,0x08);
- bbc_vduq(23,117+128,0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x08);
- bbc_vduq(23,118+128,0x08,0x08,0x08,0xFF,0x00,0x00,0x00,0x00);
- bbc_vduq(23,119+128,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08);
- bbc_vduq(23,120+128,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08);
-
- bbc_vduq(23,121+128,0x0C,0x18,0x30,0x60,0x30,0x18,0x7C,0x00);
- bbc_vduq(23,122+128,0x30,0x18,0x0C,0x06,0x0C,0x18,0x3E,0x00);
- bbc_vduq(23,123+128,0x00,0x00,0x3E,0x14,0x14,0x14,0x14,0x00);
- bbc_vduq(23,124+128,0x02,0x04,0x7E,0x08,0x7E,0x20,0x40,0x00);
- bbc_vduq(23,125+128,0x1C,0x36,0x30,0x7C,0x30,0x30,0x7E,0x00);
- bbc_vduq(23,126+128,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00);
-
- bbc_vduq(23,127+128,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
-
- bbc_vduq(17, 128 + Window->Background[ATTR_NORMAL]);
- bbc_vduq(17, Window->Foreground[ATTR_NORMAL]);
- bbc_cls();
- }
-
- static void Window_Scroll(struct Window_Struct *Window)
- {
- int i;
-
- Window->y += Window->x / 80;
- Window->x %= 80;
-
- if (Window->y < Window->Top)
- {
- for (i = 0; i < (Window->Top - Window->y); i++)
- bbc_vduq(23, 7, 0, 2, 0, 0, 0, 0, 0, 0);
-
- Window->y = Window->Top;
- }
-
- if (Window->y > Window->Bottom)
- {
- for (i = 0; i < (Window->y - Window->Bottom); i++)
- bbc_vduq(23, 7, 0, 3, 0, 0, 0, 0, 0, 0);
-
- Window->y = Window->Bottom;
- }
-
- bbc_vduq(31, Window->x, Window->y);
- }
-
- static os_error *Changed_Box(int Flag, change_box **Box)
- {
- os_regset r;
- os_error *e;
-
- r.r[0] = Flag;
- e = os_swix(OS_ChangedBox, &r);
- if (e == 0) *Box = (change_box *)(r.r[1]);
-
- return(e);
- }
-
- static int keyscan(int key)
- {
- int x, y;
-
- x = key ^ 0x80;
-
- os_byte(121, &x, &y);
-
- return((x == 0) ? 0 : 1);
- }
-